স্প্রিং ব্যাচ (Spring Batch) সাধারণত ব্যাচ প্রসেসিংয়ের জন্য ব্যবহৃত হয়, যেখানে ডেটা প্রসেসিং কাজগুলি ব্যাচ আকারে নির্দিষ্ট সময় বা নির্দিষ্ট ইন্টারভ্যাল পর পর করা হয়। Spring Batch Scheduling একটি গুরুত্বপূর্ণ ফিচার, যা আপনাকে ব্যাচ জবগুলো নির্দিষ্ট সময় অথবা ইন্টারভ্যাল অনুযায়ী স্বয়ংক্রিয়ভাবে এক্সিকিউট করতে সাহায্য করে।
স্প্রিং ব্যাচে সিডিউলিংয়ের জন্য সাধারণত Spring Scheduler বা Quartz Scheduler ব্যবহার করা হয়। নিচে এই বিষয়গুলোর ব্যবহার উদাহরণ সহ আলোচনা করা হয়েছে।
Spring Batch Scheduling এর জন্য Spring Scheduler ব্যবহার করা
স্প্রিং ব্যাচে Spring Scheduler ব্যবহার করে ব্যাচ জবগুলো নির্দিষ্ট সময় বা ইন্টারভ্যাল পর পর সিডিউল করা যায়। এই কাজটি করতে হলে, আপনাকে @EnableScheduling অ্যানোটেশন এবং @Scheduled অ্যানোটেশন ব্যবহার করতে হবে।
Spring Scheduler এর সাথে Scheduling কনফিগারেশন
- @EnableScheduling: এটি স্প্রিং কনটেক্সটের মধ্যে সিডিউলিং সক্ষম করে।
- @Scheduled: এটি নির্দিষ্ট সময়ে বা ইন্টারভ্যাল পর পর মেথডকে রান করার জন্য ব্যবহার করা হয়।
উদাহরণ:
Job Scheduling Example with Spring Scheduler:
@Configuration
@EnableScheduling
public class BatchJobScheduler {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
@Scheduled(fixedRate = 5000) // 5 সেকেন্ড পর পর জব রান হবে
public void runJob() {
try {
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(job, jobParameters);
System.out.println("Batch job started...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে:
@Scheduled(fixedRate = 5000)- এটি একটি নির্দিষ্ট ইন্টারভ্যাল (৫ সেকেন্ড) পর পর জব রান করবে।JobParametersBuilderব্যবহার করে একটি নতুন প্যারামিটারtimeযুক্ত করা হয়েছে যাতে প্রতিটি জব এক্সিকিউশনের জন্য আলাদা প্যারামিটার তৈরি হয়।
অন্যান্য Scheduling অপশন:
- fixedRate: নির্দিষ্ট সময় পর পর জব এক্সিকিউট করবে।
- fixedDelay: একটি জব শেষ হওয়ার পরে নির্দিষ্ট সময় পর পর পরবর্তী জব এক্সিকিউট হবে।
- cron: ক্রন এক্সপ্রেশন ব্যবহার করে জবের সময় নির্ধারণ করা যায় (যেমন, প্রতি রাত ১২ টায় জব রান করা)।
@Scheduled(cron = "0 0 0 * * ?") // প্রতিদিন রাত ১২ টায় রান হবে
public void runDailyJob() {
// আপনার ব্যাচ জব রান করার কোড
}
Quartz Scheduler ব্যবহার করে Spring Batch Scheduling
Quartz Scheduler হল একটি শক্তিশালী, ওপেন সোর্স টাস্ক সিডিউলার যা ব্যাচ প্রসেসিংয়ের জন্য আরও উন্নত অপশন সরবরাহ করে। এটি জব সিডিউলিংয়ে আরও বেশি কনফিগারেশন অপশন, যেমন ক্রন এক্সপ্রেশন, রিপিট ইন্টারভ্যাল, এবং সিস্টেমের স্থিতিশীলতা বজায় রাখে।
Quartz Scheduler কনফিগারেশন
স্প্রিং ব্যাচে Quartz সিডিউলিং ব্যবহার করতে হলে, আপনাকে প্রথমে Quartz এর ডিপেন্ডেন্সি যোগ করতে হবে।
<!-- pom.xml এ Quartz ডিপেন্ডেন্সি -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
Quartz Scheduler এর সাথে Spring Batch Job Scheduling উদাহরণ:
@Configuration
@EnableScheduling
public class QuartzBatchJobScheduler {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
@Bean
public JobDetail jobDetail() {
return JobBuilder.newJob(QuartzJob.class)
.withIdentity("batchJob")
.storeDurably()
.build();
}
@Bean
public Trigger jobTrigger() {
return TriggerBuilder.newTrigger()
.withIdentity("batchJobTrigger")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(60)
.repeatForever())
.build();
}
@Bean
public Scheduler scheduler() throws SchedulerException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail(), jobTrigger());
return scheduler;
}
}
এখানে:
- JobDetail: এটি ব্যাচ জবের মেটাডেটা এবং তার কনফিগারেশন ধারণ করে।
- Trigger: এটি সিডিউলারকে নির্দেশ দেয় কবে জবটি এক্সিকিউট হবে। উদাহরণস্বরূপ,
withIntervalInSeconds(60)৬০ সেকেন্ড পর পর ব্যাচ জবটি এক্সিকিউট করবে। - Scheduler: এটি
JobDetailএবংTriggerকনফিগার করে এবং সিডিউলার তৈরি করে।
QuartzJob ক্লাস:
public class QuartzJob extends QuartzJobBean {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
try {
JobParameters jobParameters = new JobParametersBuilder()
.addLong("time", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(job, jobParameters);
System.out.println("Batch job executed by Quartz Scheduler...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে, QuartzJob ক্লাসটি QuartzJobBean থেকে ইন্টারফেস ইমপ্লিমেন্ট করে এবং ব্যাচ জব এক্সিকিউট করে।
উপসংহার
স্প্রিং ব্যাচ (Spring Batch) এর সিডিউলিংয়ে আপনি Spring Scheduler বা Quartz Scheduler ব্যবহার করতে পারেন। Spring Scheduler সহজ এবং সরল সিডিউলিংয়ের জন্য উপযুক্ত, যেখানে ব্যাচ জবগুলো নির্দিষ্ট সময় বা ইন্টারভ্যাল পর পর এক্সিকিউট করা হয়। অন্যদিকে, Quartz Scheduler আরও শক্তিশালী এবং কাস্টমাইজযোগ্য অপশন প্রদান করে, যেমন ক্রন এক্সপ্রেশন এবং উন্নত ট্রিগারিং অপশন।
আপনি যে ফ্রেমওয়ার্কটি ব্যবহার করেই সিডিউলিং করতে চান না কেন, তা স্প্রিং ব্যাচে ব্যাচ জবের নির্দিষ্ট সময় বা ইন্টারভ্যাল অনুযায়ী কার্যকরভাবে রান করার জন্য সহায়ক হবে।
স্প্রিং ব্যাচ (Spring Batch) হল একটি শক্তিশালী ফ্রেমওয়ার্ক, যা বিশেষভাবে বড় পরিমাণ ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়, যেমন ডেটা মাইগ্রেশন, ডেটা ট্রান্সফরমেশন এবং ডেটা লোডিং। যখন ব্যাচ প্রসেসিংয়ের কাজ একাধিক সময়সূচিতে সম্পন্ন করার প্রয়োজন হয়, তখন Job Scheduling ব্যবহার করা হয়। স্প্রিং ব্যাচে Job Scheduling-এর মাধ্যমে নির্দিষ্ট সময়ের মধ্যে ব্যাচ জব চালানো সম্ভব হয়, যা সাধারণত অ্যাপ্লিকেশন ডেভেলপমেন্টে প্রয়োজন হয়, যেমন রাতে ডেটা আপডেট করা, দৈনিক বা সাপ্তাহিক রিপোর্ট তৈরি করা ইত্যাদি।
স্প্রিং ব্যাচ নিজে কোনো সিডিউলার (Scheduler) প্রদান না করলেও, এটি অন্যান্য সিডিউলার ফ্রেমওয়ার্কের সঙ্গে সহজেই ইন্টিগ্রেট করা যায়, যেমন Quartz Scheduler অথবা Spring Task Scheduler।
Job Scheduling-এর প্রয়োজনীয়তা
- অটোমেশন: ব্যাচ প্রসেসিং কাজগুলো নির্দিষ্ট সময়ে স্বয়ংক্রিয়ভাবে সম্পন্ন করা যায়, যা ম্যানুয়াল ইনপুট বা প্রক্রিয়া প্রয়োজনীয়তা কমিয়ে দেয়।
- পারফরম্যান্স: নির্দিষ্ট সময়ে ব্যাচ কাজগুলো চালানোর মাধ্যমে সিস্টেমের ওপর চাপ কমানো যায়, বিশেষত যখন বড় পরিমাণ ডেটার সঙ্গে কাজ করা হয়।
- নির্ভরযোগ্যতা: নির্দিষ্ট সময়ের মধ্যে কাজ সম্পন্ন করার জন্য Job Scheduling ব্যবহৃত হলে, এটির কার্যকারিতা নির্ভরযোগ্য থাকে এবং নির্ধারিত সময়ে কাজ সম্পন্ন হয়।
স্প্রিং ব্যাচ Job Scheduling করার জন্য কৌশল
স্প্রিং ব্যাচে Job Scheduling-এর জন্য দুটি প্রধান কৌশল ব্যবহৃত হয়:
- Spring TaskScheduler: এটি স্প্রিং ফ্রেমওয়ার্কের একটি অংশ এবং এতে নির্দিষ্ট সময় পর পর ব্যাচ জব চালানোর জন্য সহজ কনফিগারেশন সমর্থন করা হয়।
- Quartz Scheduler: এটি একটি শক্তিশালী, ওপেন সোর্স সিডিউলিং ফ্রেমওয়ার্ক, যা অনেক বেশি কনফিগারেশন অপশন এবং ক্ষমতা প্রদান করে।
১. Spring TaskScheduler দিয়ে Job Scheduling
স্প্রিং ফ্রেমওয়ার্কের TaskScheduler ক্লাস ব্যাচ জবের জন্য একটি সহজ ও লাইটওয়েট সিডিউলার সেবা প্রদান করে। এখানে আমরা @Scheduled অ্যানোটেশন ব্যবহার করে একটি ব্যাচ জব সিডিউল করতে পারি।
উদাহরণ: Spring TaskScheduler দিয়ে Job Scheduling
ধরা যাক, আমাদের একটি স্প্রিং ব্যাচ জব রয়েছে যা প্রতিদিন রাত ১২টায় চালাতে হবে। এটি করার জন্য আমরা Spring TaskScheduler ব্যবহার করব।
Step 1: @Scheduled অ্যানোটেশন ব্যবহার
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job importUserJob;
@Scheduled(cron = "0 0 0 * * ?") // This cron expression runs the job at 12 AM every day
public void runJob() throws Exception {
JobParameters jobParameters = new JobParametersBuilder()
.addLong("timestamp", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(importUserJob, jobParameters);
}
}
এখানে:
@Scheduled(cron = "0 0 0 * * ?"): এই ক্রন এক্সপ্রেশনটি প্রতিদিন রাত ১২টায় জব চালানোর জন্য নির্ধারিত হয়েছে।jobLauncher.run(): স্প্রিং ব্যাচের জব চালানোর জন্য ব্যবহৃত হয়।
এই পদ্ধতি স্প্রিং ফ্রেমওয়ার্কের TaskScheduler এর মাধ্যমে সহজ এবং কার্যকর।
২. Quartz Scheduler দিয়ে Job Scheduling
Quartz Scheduler একটি শক্তিশালী ওপেন সোর্স জব সিডিউলিং লাইব্রেরি, যা স্প্রিং ব্যাচের সাথে ইন্টিগ্রেট করা যেতে পারে। এটি বেশি কনফিগারেশন সুবিধা প্রদান করে এবং বড় পরিমাণ কাজ সিডিউল করার জন্য উপযুক্ত।
উদাহরণ: Quartz Scheduler দিয়ে Job Scheduling
স্প্রিং ব্যাচে Quartz Scheduler ইন্টিগ্রেট করতে কিছু পদক্ষেপ অনুসরণ করতে হবে।
Step 1: Maven Dependencies
প্রথমে, আপনাকে spring-boot-starter-quartz ডিপেনডেন্সি আপনার pom.xml ফাইলে যোগ করতে হবে।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
Step 2: Quartz Configurator Class
এখন, Quartz কনফিগারেশন ক্লাস তৈরি করতে হবে। এখানে আমরা একটি JobDetail এবং Trigger তৈরি করব, যা ব্যাচ জবটি সিডিউল করবে।
@Configuration
public class QuartzConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job importUserJob;
@Bean
public JobDetail jobDetail() {
return JobBuilder.newJob(QuartzJob.class)
.withIdentity("importUserJob")
.storeDurably()
.build();
}
@Bean
public Trigger trigger() {
return TriggerBuilder.newTrigger()
.forJob(jobDetail())
.withIdentity("importUserJobTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 * * ?")) // Runs at 12 AM every day
.build();
}
@Bean
public Scheduler scheduler() throws SchedulerException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail(), trigger());
return scheduler;
}
}
Step 3: Quartz Job Class
এখন, আমরা একটি QuartzJob ক্লাস তৈরি করব যা আমাদের ব্যাচ জব চালাবে।
public class QuartzJob implements Job {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job importUserJob;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
JobParameters jobParameters = new JobParametersBuilder()
.addLong("timestamp", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(importUserJob, jobParameters);
} catch (Exception e) {
throw new JobExecutionException(e);
}
}
}
এখানে:
QuartzJob: এই ক্লাসটি স্প্রিং ব্যাচ জব চালানোর জন্য তৈরি করা হয়েছে।JobExecutionContext: Quartz সিডিউলারের কাজের জন্য এটি ব্যবহার করা হয়।
Step 4: স্প্রিং ব্যাচের Job
এখন স্প্রিং ব্যাচের সাধারণ Job কনফিগারেশনটি যুক্ত করতে হবে, যেমন পূর্বের উদাহরণে দেখানো হয়েছিল।
উপসংহার
স্প্রিং ব্যাচের Job Scheduling একটি অত্যন্ত গুরুত্বপূর্ণ ফিচার যা ব্যাচ প্রসেসিংকে নির্দিষ্ট সময়ে চালানোর জন্য ব্যবহৃত হয়। স্প্রিং ব্যাচে জব সিডিউল করতে দুটি প্রধান পদ্ধতি রয়েছে: Spring TaskScheduler এবং Quartz Scheduler।
- Spring TaskScheduler সহজ এবং লাইটওয়েট সিডিউলিংয়ের জন্য উপযুক্ত এবং সহজ কনফিগারেশন সুবিধা দেয়।
- Quartz Scheduler অধিক কনফিগারেশন ক্ষমতা এবং শক্তিশালী সিডিউলিং অপশন প্রদান করে, যা বড় অ্যাপ্লিকেশন এবং জটিল কাজ সিডিউল করার জন্য আদর্শ।
আপনি আপনার প্রয়োজন অনুযায়ী যে কোনো একটি পদ্ধতি ব্যবহার করে স্প্রিং ব্যাচের জব সিডিউল করতে পারেন।
Spring Batch ফ্রেমওয়ার্কে ডেটা প্রসেসিং এর কাজগুলি সাধারণত Batch Jobs আকারে পরিচালিত হয়, যা নির্দিষ্ট সময় বা নির্দিষ্ট সময়সীমায় সম্পাদিত হয়। এই কাজগুলি স্বয়ংক্রিয়ভাবে চলতে পারে এবং পরবর্তী কাজের জন্য প্রস্তুতি নিতে পারে। Spring Batch-এর সাথে Job Scheduling একটি গুরুত্বপূর্ণ বিষয়। এর জন্য দুটি জনপ্রিয় এবং কার্যকরী টুল হল Spring Scheduler এবং Quartz Scheduler।
Spring Scheduler এবং Quartz Scheduler এর মাধ্যমে Scheduling
1. Spring Scheduler
Spring Scheduler একটি সহজ এবং হালকা টুল যা Spring Framework-এ টাস্ক বা ব্যাচ জব চালানোর জন্য ব্যবহৃত হয়। এটি @Scheduled অ্যানোটেশন বা TaskScheduler ব্যবহার করে ব্যাচ কাজগুলো নির্দিষ্ট সময়সূচী অনুযায়ী চালাতে সাহায্য করে।
Spring Scheduler এর বৈশিষ্ট্য:
- সহজ কনফিগারেশন: Spring Scheduler এর কনফিগারেশন খুবই সহজ এবং সহজে ব্যবহারযোগ্য।
- অ্যানোটেশন ভিত্তিক: ব্যাচ কাজগুলি সময়নির্ধারণের জন্য @Scheduled অ্যানোটেশন ব্যবহার করা হয়।
- টাইমার এবং ডেলেইড এক্সিকিউশন: নির্দিষ্ট সময় পর টাস্ক বা জব চালানোর জন্য উপযুক্ত।
উদাহরণ: Spring Scheduler ব্যবহার করে Job Scheduling
Spring Boot অ্যাপ্লিকেশন ব্যবহার করে একটি নির্দিষ্ট সময়সূচীতে জব চালানোর উদাহরণ:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class MyScheduledJob {
@Scheduled(fixedRate = 5000) // প্রতি 5 সেকেন্ড পর পর কাজটি চালানো হবে
public void runJob() {
System.out.println("Job is running every 5 seconds...");
}
@Scheduled(cron = "0 0/1 * * * ?") // প্রতি 1 মিনিট পর পর কাজটি চালানো হবে
public void runJobEveryMinute() {
System.out.println("Job is running every minute...");
}
}
এখানে:
- @Scheduled(fixedRate = 5000): এটি একটি নির্দিষ্ট সময়ের পর পর কাজ চালাবে, যেমন ৫ সেকেন্ড পর পর।
- @Scheduled(cron = "0 0/1 * * * ?"): এটি Cron Expression ব্যবহার করে প্রতি এক মিনিট পর কাজ চালাবে।
কনফিগারেশন
Spring Boot অ্যাপ্লিকেশনটি @EnableScheduling অ্যানোটেশন ব্যবহার করে সিডিউলিং সক্ষম করতে হয়।
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
@Configuration
@EnableScheduling
public class SchedulingConfig {
// Scheduling Configuration
}
2. Quartz Scheduler
Quartz Scheduler একটি আরও শক্তিশালী এবং বৈশিষ্ট্যপূর্ণ টুল যা Job Scheduling এবং Triggering জন্য ব্যবহৃত হয়। এটি সাধারণত বড় এবং জটিল ব্যাচ প্রক্রিয়া পরিচালনা করতে ব্যবহৃত হয় যেখানে সময়সূচী, ট্রিগার এবং শিডিউলিংয়ের আরও বেশি নিয়ন্ত্রণ প্রয়োজন।
Quartz Scheduler এর বৈশিষ্ট্য:
- ভিন্ন ধরনের ট্রিগার: Simple Trigger, Cron Trigger ইত্যাদি।
- পারফরম্যান্স এবং স্কেলেবিলিটি: Quartz Batch Job এর জন্য একটি দুর্দান্ত সল্যুশন যা অনেক বড় পরিমাণ কাজের জন্য কার্যকর।
- Persistence: Quartz Scheduler ডেটাবেসে Job এবং Trigger স্টেট সংরক্ষণ করতে পারে, ফলে জবের অবস্থা রক্ষা করা যায়।
- শক্তিশালী ফিচারস: Job Listener, Job Execution Listener, JobDataMap ইত্যাদি।
Quartz Scheduler ইন্টিগ্রেশন:
Spring Boot এবং Quartz ইন্টিগ্রেশন সহজেই করা যায়। Quartz Scheduler Spring Batch এর সাথে ব্যবহার করে Job এবং Trigger কনফিগার করা যায়। Quartz Job এর সাথে কাজের সময় নির্ধারণের জন্য Cron Expression ব্যবহার করা হয়।
উদাহরণ: Quartz Scheduler Setup in Spring Boot
প্রথমে, Spring Boot প্রজেক্টে Quartz Scheduler এর জন্য প্রয়োজনীয় ডিপেনডেন্সি যোগ করতে হবে।
Maven ডিপেনডেন্সি:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
Quartz Job কনফিগারেশন:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
@Component
public class MyQuartzJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Quartz Job is running...");
}
}
Quartz Trigger কনফিগারেশন:
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfig {
@Bean
public Trigger cronTrigger() {
return TriggerBuilder.newTrigger()
.withIdentity("cronTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")) // প্রতি 1 মিনিটে জব চালানোর জন্য
.build();
}
@Bean
public org.quartz.JobDetail jobDetail() {
return JobBuilder.newJob(MyQuartzJob.class)
.withIdentity("myQuartzJob")
.storeDurably()
.build();
}
@Bean
public org.quartz.Scheduler scheduler() throws Exception {
org.quartz.Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail(), cronTrigger());
scheduler.start();
return scheduler;
}
}
এখানে:
- JobDetail: এটি Quartz Job এবং তার কনফিগারেশন ধারণ করে।
- Trigger: এটি Quartz Job এর কার্যকরী সময় নির্ধারণ করে, যেমন প্রতি মিনিটে, প্রতি ঘণ্টায় ইত্যাদি।
- CronScheduleBuilder: এটি Cron Expression ব্যবহার করে নির্দিষ্ট সময় অনুযায়ী কাজের সময় নির্ধারণ করে।
Quartz Job Execution Example:
এই কনফিগারেশন কোড Quartz Scheduler কে ১ মিনিট পর পর MyQuartzJob চালাতে সিডিউল করবে।
Spring Batch এবং Scheduling: Quartz vs Spring Scheduler
| বৈশিষ্ট্য | Spring Scheduler | Quartz Scheduler |
|---|---|---|
| ব্যবহার | ছোট ও সাধারণ কাজের জন্য উপযুক্ত | বড় এবং জটিল কাজের জন্য উপযুক্ত |
| ফিচার | সহজ কনফিগারেশন, অ্যানোটেশন ভিত্তিক | শক্তিশালী ট্রিগার, কাস্টম জব মেটাডেটা, পেরসিস্টেন্স |
| পারফরম্যান্স | হালকা কাজের জন্য উপযুক্ত | বড় পরিমাণ ডেটা বা কাজের জন্য পারফরম্যান্স উন্নত |
| ডিপেনডেন্সি | কম এবং সহজ | বেশি এবং অধিক কনফিগারেশন সহ |
| ক্রন এক্সপ্রেশন | সমর্থিত | সমর্থিত, আরও উন্নত বৈশিষ্ট্য |
| প্ল্যানিং ফিচার | নির্দিষ্ট সময় অনুযায়ী কাজ সিডিউল করা | খুব শক্তিশালী, পুনরায় চালানো (restartability) |
সারসংক্ষেপ
Spring Batch এবং Scheduling খুবই গুরুত্বপূর্ণ হতে পারে, যখন আপনাকে ব্যাচ প্রসেসিংয়ের জন্য নির্দিষ্ট সময়সূচীতে কাজ চালাতে হয়। Spring Scheduler সহজ এবং সরল টাস্ক সিডিউলিংয়ের জন্য উপযুক্ত, তবে যখন কাজ জটিল এবং বড় আকারে হতে হয়, তখন Quartz Scheduler ব্যবহার করা ভালো। Quartz শক্তিশালী ট্রিগারিং এবং পারসিস্টেন্স ফিচার সহ বড় ব্যাচ জব সিডিউলিং এবং পরিচালনায় কার্যকর।
Spring Batch এর মধ্যে Job Scheduling একটি গুরুত্বপূর্ণ কার্যকলাপ, যেখানে নির্দিষ্ট সময়ে বা নির্দিষ্ট নিয়মে কোনো Job চলতে পারে। Cron Expressions হলো একটি বিশেষ টাইম ফরম্যাট যা একটি নির্দিষ্ট সময়সূচী (schedule) তৈরি করতে ব্যবহৃত হয়। Spring Batch এ Job Scheduling করতে Cron Expressions ব্যবহৃত হয়, যার মাধ্যমে আপনি যেকোনো Job নির্দিষ্ট সময়ে চালানোর জন্য কনফিগার করতে পারেন।
Cron Expressions কি?
Cron Expressions হলো একটি টাইমিং সিস্টেম যা আপনি একটি নির্দিষ্ট সময়সূচী (schedule) তৈরি করতে ব্যবহার করতে পারেন। এটি UNIX-এর cron কমান্ডের ভিত্তিতে কাজ করে, যা একটি টাস্ক নির্দিষ্ট সময়ে বা নির্দিষ্ট সময়ের মধ্যে পুনরাবৃত্তি করে।
একটি Cron Expression সাধারণত ৫টি বা ৬টি ফিল্ড নিয়ে গঠিত হয়:
- (Field 1): মিনিট (0 - 59)
- (Field 2): ঘণ্টা (0 - 23)
- (Field 3): দিন (1 - 31)
- (Field 4): মাস (1 - 12)
- (Field 5): সপ্তাহের দিন (0 - 6) [0 = Sunday]
- (Field 6): বছরের কোনো নির্দিষ্ট দিন (optional)
Cron Expression উদাহরণ:
0 0 12 * * ?— প্রতি দিন দুপুর ১২টায়।0 15 10 * * ?— প্রতি দিন ১০:১৫ AM-এ।0 0/5 * * * ?— প্রতি ৫ মিনিটে।
Spring Batch এ Cron Expression ব্যবহার করে Job Scheduling
Spring Batch এ Job Scheduling করার জন্য Spring Scheduler বা Spring TaskScheduler ব্যবহার করা হয়। যদি আপনি নির্দিষ্ট সময়ে একটি Batch Job চালাতে চান, তাহলে আপনি @Scheduled এনোটেশন এবং Cron Expressions ব্যবহার করতে পারেন।
Spring Batch এর Cron Expression এর মাধ্যমে Job Scheduling করার জন্য Spring Boot Scheduler বা Quartz Scheduler ব্যবহার করা যেতে পারে।
Spring Batch এ Cron Expressions ব্যবহার করে Job Scheduling উদাহরণ
১. Spring Boot এ Cron Expression ব্যবহার করে Job Scheduling
Spring Boot এর মধ্যে @Scheduled এনোটেশন ব্যবহার করা হয় Job Scheduling এর জন্য। আপনি @Scheduled(cron = "cron expression") এনোটেশন ব্যবহার করে Job কে একটি নির্দিষ্ট সময়ে রান করাতে পারেন।
উদাহরণ:
import org.springframework.batch.core.Job;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class JobScheduler {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job myJob; // Spring Batch Job
@Scheduled(cron = "0 0 12 * * ?") // প্রতিদিন দুপুর ১২টায় Job রান হবে
public void runJob() {
try {
jobLauncher.run(myJob, new JobParameters());
} catch (Exception e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
@Scheduled(cron = "0 0 12 * * ?"): এই Cron Expression প্রতিদিন দুপুর ১২টায় Job রান করবে।JobLauncher: এটি Job শুরু করতে ব্যবহৃত হয়।JobParameters: Job-এর প্যারামিটারগুলি পাস করতে ব্যবহৃত হয়।
২. Cron Expression এর ধরন
Spring Batch এর Job Scheduling এ Cron Expression কিছু বিশেষ ধরনের ব্যবহার হতে পারে:
0 0 12 * * ?— প্রতিদিন দুপুর ১২টায়।0 15 10 * * ?— প্রতি দিন সকাল ১০:১৫ AM-এ।0 0/5 * * * ?— প্রতি ৫ মিনিটে।0 0 0 1 * ?— প্রতি মাসের প্রথম দিন মধ্যরাতে।
৩. @Scheduled এনোটেশন এবং Cron Expression
Cron Expressions এর মাধ্যমে Scheduling খুব সহজেই করা যায় Spring Boot অ্যাপ্লিকেশনে। আপনার Job বা টাস্ককে নির্দিষ্ট সময়ে বা নির্দিষ্ট সময়ের মধ্যে রান করার জন্য আপনি @Scheduled এনোটেশন ব্যবহার করতে পারেন।
Cron Expression এর অন্যান্য কিছু উদাহরণ:
| Cron Expression | অর্থ |
|---|---|
0 0 12 * * ? | প্রতিদিন দুপুর ১২টায় রান হবে |
0 0 10 * * ? | প্রতিদিন ১০:০০ AM-এ রান হবে |
0 0/15 9-17 * * ? | প্রতিদিন সকাল ৯টা থেকে বিকেল ৫টা পর্যন্ত প্রতি ১৫ মিনিটে রান হবে |
0 0 1 * * ? | প্রতি মাসের প্রথম দিনে রান হবে |
0 0 0 * * SUN | প্রতি রবিবার মধ্যরাতে রান হবে |
৪. Quartz Scheduler Integration (ঐচ্ছিক)
Spring Batch-এ আরও উন্নত সিডিউলিং করতে Quartz Scheduler ব্যবহার করা যেতে পারে। Quartz Scheduler Spring Batch এর সঙ্গে সহজে ইন্টিগ্রেট হতে পারে, যেখানে Cron Expression এর মাধ্যমে Job Execution Time নির্ধারণ করা হয়।
Quartz Scheduler ব্যবহার করে Spring Batch Job Scheduling:
import org.quartz.*;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.Job;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
@Component
public class QuartzJobScheduler extends QuartzJobBean {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job myJob; // Spring Batch Job
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
try {
jobLauncher.run(myJob, new JobParameters());
} catch (Exception e) {
e.printStackTrace();
}
}
@Bean
public JobDetail jobDetail() {
return JobBuilder.newJob(QuartzJobScheduler.class)
.withIdentity("job1")
.storeDurably()
.build();
}
@Bean
public Trigger trigger() {
return TriggerBuilder.newTrigger()
.withIdentity("trigger1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 * * ?"))
.build();
}
}
এখানে Quartz Scheduler ব্যবহার করে Cron Expression এর মাধ্যমে Spring Batch Job রান করার প্রক্রিয়া দেখানো হয়েছে।
সারাংশ
Cron Expressions Spring Batch-এ Job Scheduling এর জন্য একটি অত্যন্ত গুরুত্বপূর্ণ টুল, যা নির্দিষ্ট সময়ে বা নির্দিষ্ট সময়ের মধ্যে Job চালানোর সুবিধা প্রদান করে। Spring Boot এর @Scheduled এনোটেশন বা Quartz Scheduler এর মাধ্যমে Cron Expressions ব্যবহার করা হয়। এই ধরনের সিডিউলিংয়ের মাধ্যমে ডেটা প্রক্রিয়াকরণ, রিপোর্টিং, বিলিং, বা অন্যান্য ব্যাচ প্রসেসিং কাজগুলি নির্দিষ্ট সময়ে বা নিয়মিতভাবে অটোমেটিক্যালি চালানো যায়। Spring Batch এর মাধ্যমে Cron Expressions ব্যবহার করে ব্যাচ কাজগুলি স্কেলেবল এবং দক্ষভাবে পরিচালিত হয়।
স্প্রিং ব্যাচ (Spring Batch) ব্যাচ প্রসেসিংয়ের জন্য একটি শক্তিশালী ফ্রেমওয়ার্ক, যা ডেটা প্রসেসিং টাস্কগুলিকে ব্যাচ আকারে পরিচালনা করতে সহায়তা করে। যখন আমাদের ব্যাচ জব নির্দিষ্ট সময় পর পর চালানো প্রয়োজন হয়, তখন Batch Job Scheduling ব্যবহার করা হয়। এই প্রক্রিয়া স্বয়ংক্রিয়ভাবে একটি ব্যাচ জব নির্দিষ্ট সময়সীমার মধ্যে চালাতে সক্ষম হয়।
স্প্রিং ব্যাচের মাধ্যমে batch job scheduling পরিচালনা করতে আমরা সাধারণত Spring TaskScheduler বা Quartz Scheduler ব্যবহার করি। এখানে আমরা Spring TaskScheduler ব্যবহার করে একটি ব্যাচ জব সিডিউল করার উদাহরণ দেখব।
Batch Job Scheduling উদাহরণ
ধরা যাক, আমাদের একটি ব্যাচ জব রয়েছে, যা প্রতি দিন ১ ঘণ্টায় একবার চালাতে হবে। এই জবটি Employee টেবিল থেকে ডেটা রিড এবং প্রসেস করার কাজ করবে।
১. স্প্রিং ব্যাচ জব কনফিগারেশন
আমরা প্রথমে একটি সাধারণ ব্যাচ জব তৈরি করব, যা Employee টেবিল থেকে ডেটা রিড করবে এবং কিছু প্রসেসিং শেষে সেই ডেটা আপডেট করবে।
উদাহরণ: Employee Salary Update Job
import org.springframework.batch.core.Step;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BatchConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
public BatchConfig(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
}
@Bean
public Job updateEmployeeSalaryJob() {
return jobBuilderFactory.get("updateEmployeeSalaryJob")
.start(processEmployeeSalaryStep())
.build();
}
@Bean
public Step processEmployeeSalaryStep() {
return stepBuilderFactory.get("processEmployeeSalaryStep")
.<Employee, Employee>chunk(10)
.reader(reader(null)) // Reader: JdbcCursorItemReader
.processor(new EmployeeSalaryProcessor()) // Processor: EmployeeSalaryProcessor
.writer(writer(null)) // Writer: JdbcBatchItemWriter
.build();
}
}
এখানে, updateEmployeeSalaryJob নামক একটি জব তৈরি করা হয়েছে, যা processEmployeeSalaryStep নামক স্টেপ থেকে ডেটা রিড এবং প্রসেস করবে।
২. স্প্রিং টাস্ক সিডিউলার ব্যবহার করা
এখন, TaskScheduler ব্যবহার করে প্রতি ঘণ্টায় একবার ব্যাচ জব চালানোর জন্য কনফিগারেশন করা হবে।
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.Job;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
public class JobScheduler {
private final JobLauncher jobLauncher;
private final Job updateEmployeeSalaryJob;
public JobScheduler(JobLauncher jobLauncher, Job updateEmployeeSalaryJob) {
this.jobLauncher = jobLauncher;
this.updateEmployeeSalaryJob = updateEmployeeSalaryJob;
}
@Scheduled(cron = "0 0 * * * ?") // প্রতি ঘণ্টায় একবার
public void runJob() {
try {
jobLauncher.run(updateEmployeeSalaryJob, new JobParameters());
} catch (Exception e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- @EnableScheduling অ্যানোটেশনটি স্প্রিং কনটেক্সটে সিডিউলিং সক্ষম করে।
- @Scheduled(cron = "0 0 * * * ?") এই ক্রন এক্সপ্রেশনটি প্রতি ঘণ্টায় একবার ব্যাচ জব চালানোর জন্য ব্যবহৃত হয়। এখানে
0 0 * * * ?মানে প্রতি ঘণ্টার শুরুর সময়। - jobLauncher.run(updateEmployeeSalaryJob, new JobParameters()) এটি ব্যাচ জব রান করার কোড, যা স্প্রিং ব্যাচে ডিফাইন করা জবকে নির্দিষ্ট সময়সীমায় চালায়।
৩. স্প্রিং কনফিগারেশন (ApplicationConfig)
এখন, স্প্রিং কনফিগারেশন ফাইলে সিডিউলার এবং ব্যাচ প্রসেসিংয়ের জন্য প্রয়োজনীয় কনফিগারেশন এবং টাস্ক সিডিউলার সেট আপ করা হবে।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.context.annotation.ComponentScan;
import javax.sql.DataSource;
@Configuration
@EnableBatchProcessing
@EnableScheduling
@ComponentScan(basePackages = "com.example.batch")
public class BatchApplicationConfig {
@Bean
public JobLauncher jobLauncher(JobRepository jobRepository) {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository);
return jobLauncher;
}
@Bean
public JobRepository jobRepository(DataSource dataSource) throws Exception {
MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean();
factory.setDataSource(dataSource);
return factory.getObject();
}
@Bean
public JobBuilderFactory jobBuilderFactory(JobRepository jobRepository) {
return new JobBuilderFactory(jobRepository);
}
@Bean
public StepBuilderFactory stepBuilderFactory(JobRepository jobRepository) {
return new StepBuilderFactory(jobRepository, jobRepository.getTransactionManager());
}
}
এখানে, EnableBatchProcessing এবং EnableScheduling ব্যবহৃত হয়েছে, যা ব্যাচ প্রসেসিং এবং সিডিউলিং কার্যক্রম চালাবে। jobLauncher এবং jobRepository কে কনফিগার করা হয়েছে, যাতে স্প্রিং ব্যাচ কাজ করতে পারে।
সারাংশ
স্প্রিং ব্যাচের মাধ্যমে ব্যাচ জব সিডিউলিং খুব সহজেই করা যায়, বিশেষত Spring TaskScheduler বা Quartz Scheduler ব্যবহার করে। আমাদের উদাহরণে, আমরা @Scheduled অ্যানোটেশন ব্যবহার করে প্রতি ঘণ্টায় একবার ব্যাচ জব চালানোর কনফিগারেশন দেখেছি। এই পদ্ধতিতে স্প্রিং ব্যাচের ব্যাচ জবগুলো নির্দিষ্ট সময় পর পর বা নির্দিষ্ট ক্রনের মাধ্যমে রান করা যায়, যা আপনার ডেটা প্রসেসিং টাস্কগুলোকে স্বয়ংক্রিয়ভাবে পরিচালিত করতে সাহায্য করে।
Read more